package util;


import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * 集成springmvc:文件处理工具类
 *
 * FileUpload:文件上传
 *  参数:
 *      file上传的文件
 *      request:获取servlet请求
 *      pathName:相对路径「要上传到服务器的指定目录地址」
 * FileDownload:文件下载
 *  参数:
 *      request:获取servlet请求
 *      response:获取servlet响应
 *      fileName:要下载的文件名
 *      pathName:相对路径「要从服务器的哪个目录下下载文件」
 * FileDelete:文件删除
 *  参数：
 *      pathName:指定要删除的文件的相对路径「地址」
 *      fileName:要删除的文件的文件名
 *      request:获取servlet请求
 * @author chenjf
 *
 *
 */

public class FileUtil {
    /** 文件上传 */
    public final static String FileUpload(MultipartFile file, HttpServletRequest request, String pathName) {
        String newFileName = null;
        try {
            /* 获取文件名 */
            String fileName = file.getOriginalFilename();
            /* 设置新的文件名,添加时间戳「防止上传文件重复」 */
            newFileName = System.currentTimeMillis()+"-"+fileName;
            /* 根据相对路径获取绝对路径 */
            String realPath = request.getSession().getServletContext().getRealPath(pathName);
            File files = new File(realPath,newFileName);
            /* 文件是否存在 */
            if (!files.exists()){
                /* 创建多级目录 */
                files.mkdirs();
            }
            /* 文件上传至服务器指定目录 */
            file.transferTo(files);
        } catch (IOException e) {
            e.printStackTrace();
        }
        /* 控制台打印输出 */
        System.out.println("上传前文件名："+file.getOriginalFilename());
        System.out.println("项目相对路径："+pathName);
        System.out.println("上传后文件名：" + newFileName);
        //返回新文件名，以供可上传至数据库
        return newFileName;
    }

    /** 文件下载 */
    public final static void FileDownload(HttpServletRequest request, HttpServletResponse response, String fileName, String pathName){
        FileInputStream InputStream = null;
        ServletOutputStream outputStream = null;
        try {
            /* 根据相对路径，获取绝对路径 */
            String realPath = request.getSession().getServletContext().getRealPath(pathName);
            /* 根据文件名获取服务器中的指定文件 */
            InputStream = new FileInputStream(new File(realPath,fileName));
            /*
            *  获取响应对象设置响应头信息
            *  设置响应头："content-disposition"
            *  value:
            *       默认：能直接打开则在本网页中打开文件
            *       attachment:以附件形式下载;
            *       URLEncoder.encode(fileName,"UTF-8")
            *       设置下载文件格式
            *  */
            response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode(fileName,"UTF-8"));
            /* 获取响应输出流 */
            outputStream = response.getOutputStream();
            /* 文件拷贝下载
            *  参数：
            *      输入流
            *      输出流
            *  */
            IOUtils.copy(InputStream,outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            /* 关流 */
            IOUtils.closeQuietly(InputStream);
            IOUtils.closeQuietly(outputStream);
        }
    }

    /** 文件删除 */
    public final static void FileDelete(String pathName,String fileName,HttpServletRequest request){
        /* 获取文件相对路径 */
        String realPath = request.getSession().getServletContext().getRealPath(pathName);
        /* 拼接文件的绝对路径 */
        String path = realPath+"/"+fileName;
        /* 根据绝对路径获取文件 */
        File file = new File(path);
        /* 判断文件是否存在,并且是不是一个文件夹,文件夹不能删除 */
        if (file.isFile()||file.exists()){
            file.delete();
        }
    }
}

/**
 * 特殊提示:在springmvc-servlet中需添加
 * 配置文件上传:
 * <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 *     设置文件上传支持的大小[5242880 = 5MB]
 *    <property name="maxUploadSize" value="5242880"></property>
 * </bean>
 *
 * 需要引入maven配置
 * 文件上传:
 * <dependency>
 *   <groupId>commons-fileupload</groupId>
 *   <artifactId>commons-fileupload</artifactId>
 *   <version>1.3</version>
 * </dependency>
 *
*/